#include <iostream>
using namespace std;
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

void PrintSig(sigset_t pending)
{
    cout << "process pending: ";
    for (int i = 31; i >= 1; i--)
    {
        if (sigismember(&pending, i))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

void handler(int signal)
{
    cout << "2 号信号被递达" << endl;
    exit(1);
}


int main()
{
    // 1. 屏蔽 1~31 号信号
    sigset_t block;
    sigset_t old_block;
    sigemptyset(&block);
    sigemptyset(&old_block);

    for (int i = 1; i <= 31; i++)
    {
        sigaddset(&block, i);
    }

    sigprocmask(SIG_SETMASK, &block, &old_block);
    cout << "process pid: " << getpid() << endl;
    cout << "block signal success ..." << endl;

    int cnt = 0;
    while (1)
    {
        // 2. 获取当前 pending 表
        sigset_t pending;
        sigemptyset(&pending);
        sigpending(&pending);

        // 3. 打印 pending 表
        PrintSig(pending);
        sleep(2);
    }
    return 0;
}


// int main()
// {
//     signal(SIGINT, handler);

//     // 1. 屏蔽 2 号信号
//     sigset_t block;
//     sigset_t old_block;
//     sigemptyset(&block);
//     sigemptyset(&old_block);

//     sigaddset(&block, SIGINT);
//     sigprocmask(SIG_SETMASK, &block, &old_block);
//     cout << "process pid: " << getpid() << endl;
//     cout << "block SIGINT success ..." << endl;

//     int cnt = 0;
//     while (1)
//     {
//         // 2. 获取当前 pending 表
//         sigset_t pending;
//         sigemptyset(&pending);
//         sigpending(&pending);

//         // 3. 打印 pending 表
//         // cout << "begin to print pending ..." << endl;
//         PrintSig(pending, cnt);
//         sleep(1);

//         // 4. 取消对 2 号信号对屏蔽
//         ++cnt;
//         // if (cnt == 20)
//         // {
//         //     sigprocmask(SIG_UNBLOCK, &block, &old_block);
//         // }
//     }
//     return 0;
// }

// int main()
// {
//     sigset_t sig;
//     sigemptyset(&sig);

//     sigaddset(&sig, SIGINT);

//     sigset_t oldsig;
//     sigemptyset(&oldsig);
//     sigprocmask(SIG_SETMASK, &sig, &oldsig);

//     sigset_t pending;
//     sigemptyset(&pending);

//     sigpending(&pending);

//     sigismember(&pending, SIGINT);

//     return 0;
// }